【MySQL】サブクエリ(WHERE) - SELECT結果をWHEREに使用する

【MySQL】サブクエリ(WHERE) - SELECT結果をWHEREに使用する

MySQLのサブクエリについて解説します。

検証環境

サブクエリ

サブクエリは“別のクエリ内のSELECT文”です。

SELECT文やUPDATE文、DELETE文などのWHERE句と併せてサブクエリを使います。

基本構文

クエリ ( SELECT文 )

サンプル

サブクエリはそのSELECT文による『取得レコードの数』などによって構文が変わります。

次のshopsテーブルとitemsテーブルを使って、サンプルを示します。

mysql> SELECT * FROM shops;
+----+--------------+------+
| id | name         | code |
+----+--------------+------+
|  1 | Fruits Shop  | S001 |
|  2 | Food Shop    | S002 |
|  3 | Dessert Shop | S003 |
+----+--------------+------+
3 rows in set (0.00 sec)

mysql> SELECT * FROM items;
+----+-----------+-------+-------+------+
| id | name      | price | stock | code |
+----+-----------+-------+-------+------+
|  1 | Apple     |   200 |    10 | S001 |
|  2 | Orange    |   150 |     3 | S001 |
|  3 | Pineapple |  1100 |     3 | S002 |
|  4 | Grapes    |  3500 |     1 | S002 |
+----+-----------+-------+-------+------+
4 rows in set (0.01 sec)

1レコードのみ

サブクエリの取得レコードが1つのみの場合のサンプルです。

mysql> SELECT * FROM shops
    ___ih_hl_start
    -> WHERE code = ( SELECT code FROM items where id = 1 );
    ___ih_hl_end
+----+-------------+------+
| id | name        | code |
+----+-------------+------+
|  1 | Fruits Shop | S001 |
+----+-------------+------+
1 row in set (0.00 sec)

2行目の( SELECT code FROM items where id = 1 )がサブクエリです。

WHERE句の比較値にサブクエリの結果を使用しています。

なお、サブクエリの取得レコードが複数個ある場合、この構文ではエラーが発生します。

mysql> SELECT * FROM shops 
    -> WHERE code = ( SELECT code FROM items where id IN ( 1, 3 ) );
ERROR 1242 (21000): Subquery returns more than 1 row

ANY: 複数レコード(いずれかが条件を満たす)

サブクエリの取得レコードが複数個あり、そのいずれかのデータが条件を満たすことを指定する場合はANYを使用します。

mysql> SELECT * FROM shops
    ___ih_hl_start
    -> WHERE code = ANY ( SELECT code FROM items where id IN ( 1, 3 ) );
    ___ih_hl_end
+----+-------------+------+
| id | name        | code |
+----+-------------+------+
|  1 | Fruits Shop | S001 |
|  2 | Food Shop   | S002 |
+----+-------------+------+
2 rows in set (0.00 sec)

2行目のようにサブクエリ(( SELECT code FROM items where id IN ( 1, 3 ) ))の前にANYを記述します。

ALL: 複数レコード(全てが条件を満たす)

サブクエリの取得レコードが複数個あり、その全てのデータが条件を満たすことを指定する場合はALLを使用します。

mysql> SELECT * FROM shops
    ___ih_hl_start
    -> WHERE code <> ALL ( SELECT code FROM items where id IN ( 1, 3 ) );
    ___ih_hl_end
+----+--------------+------+
| id | name         | code |
+----+--------------+------+
|  3 | Dessert Shop | S003 |
+----+--------------+------+
1 row in set (0.00 sec)

2行目のようにサブクエリ(( SELECT code FROM items where id IN ( 1, 3 ) ))の前にALLを記述します。